# 作者:杨新远
# 2025年02月24日23时16分18秒
# 2273695640@qq.com
import re


# search(只能搜第一个）
def find_second_match(pattern, text):
    matches = re.finditer(pattern, text)
    try:
        next(matches)  # 跳过第一个匹配项
        second_match = next(matches)  # 获取第二个匹配项
        return second_match.group()
    except StopIteration:
        return None


text = "abc123def456ghi789"
pattern = r"\d+"
second_match = find_second_match(pattern, text)
print(second_match)
print('-' * 50)

ret = re.findall(r"\d+", "python = 9999, c = 7890, c++ = 12345")  # 找到所有符合条件的
print(ret)  # 返回是列表类型

print('-' * 50)


def add(match_result):
    """
    返回值一定要是字符串
    :param match_result: 匹配后的match对象
    :return:
    """
    return str(int(match_result.group()) + 1)


# add是相当于回调函数把字符串匹配的结果传给了add这个函数
ret = re.sub(r'\d+', add, '阅读量666')
print(ret)
print('-' * 50)

# 定义一个包含HTML标签的字符串
test_str = """
<div>
        <p>岗位职责：</p>
<p>完成推荐算法、数据统计、接口、后台等服务器端相关工作</p>
<p><br></p>
<p>必备要求：</p>
<p>良好的自我驱动力和职业素养，工作积极主动、结果导向</p>
<p>&nbsp;<br></p>
<p>技术要求：</p>
<p>1、一年以上 Python 开发经验，掌握面向对象分析和设计，了解设计模式</p>
<p>2、掌握HTTP协议，熟悉MVC、MVVM等概念以及相关WEB开发框架</p>
<p>3、掌握关系数据库开发设计，掌握 SQL，熟练使用 MySQL/PostgreSQL 中的一种<br></p>
<p>4、掌握NoSQL、MQ，熟练使用对应技术解决方案</p>
<p>5、熟悉 Javascript/CSS/HTML5，JQuery、React、Vue.js</p>
<p>&nbsp;<br></p>
<p>加分项：</p>
<p>大数据，数理统计，机器学习，sklearn，高性能，大并发。</p>
</div>
"""

# 使用正则表达式替换掉所有的HTML标签、&nbsp;和换行符
# r"<[^>]*>|&nbsp;|\n" 是一个正则表达式，匹配所有的HTML标签、&nbsp;和换行符
# re.sub() 函数用于替换字符串中匹配正则表达式的部分[^>] 是一个 否定字符类，表示匹配 除了 > 之外的任意一个字符
ret = re.sub(r"<[^>]*>|&nbsp;|\n", "", test_str)
print(ret)

# 使用正则表达式按冒号或空格分割字符串
# r":| " 是一个正则表达式，匹配冒号或空格
# re.split() 函数用于按正则表达式匹配的部分分割字符串
ret = re.split(r":| ", "info:xiaoZhang 33 shandong")
print(ret)

# 贪婪与非贪婪匹配
# 在正则表达式中，默认是贪婪匹配，即尽可能多地匹配字符
# 在量词后面加上?可以将其变为非贪婪匹配，即尽可能少地匹配字符
s = "This is a number 234-235-22-423"

# r"(.+?)(\d+-\d+-\d+-\d+)" 是一个正则表达式，其中：
# (.+?) 是一个非贪婪匹配，匹配任意字符（除换行符外）至少一次，但尽可能少地匹配因为\d+至少匹配一次，如果没有问号，23会被group(1)匹配因为贪婪
# (\d+-\d+-\d+-\d+) 匹配一个由数字和短横线组成的字符串，例如 "234-235-22-423"
r = re.match(r"(.+?)(\d+-\d+-\d+-\d+)", s)

# 打印匹配的第一个组（即非贪婪匹配的部分）
print(r.group(1))  # 输出: "This is a number "

# 打印匹配的第二个组（即数字和短横线组成的字符串）
print(r.group(2))  # 输出: "234-235-22-423"
